package com.hmdp.utils;

import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * 该类用于生成全局唯一id
 */
//@SuppressWarnings({"all"})
@Component
public class RedisWorker {

    //记录开始时间->2023:1:1:0:0:0
    private static final long BEGIN_TIMESTAMP = 1672531200L;
    //移动位数
    private static final long COUNT_BIT = 32L;

    //使用构造方法注入stringRedisTemplate
    private StringRedisTemplate stringRedisTemplate;

    public RedisWorker(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    // prefix 代表业务前缀, 用于区分不同的业务,不同的业务id也是不同的
    public long nextId(String prefix) {
        //1.生成时间戳->用当前时间-开始时间的时间差的秒数作为时间戳
        //1.1生成当前时间
        LocalDateTime now = LocalDateTime.now();
        //当前秒数
        long curSecond = now.toEpochSecond(ZoneOffset.UTC);
        //1.2得到时间戳
        long timeStamp = curSecond - BEGIN_TIMESTAMP;
        //2.生成序列号
        //2.1将当前时间按照日期进行格式化转换
        /**
         * 每天一个key,也方便统计订单数量
         */
        String formatDate = now.format(DateTimeFormatter.ofPattern("yyyy:MM:dd"));
        Long id = stringRedisTemplate.opsForValue().increment("icr:" + prefix + ":" + formatDate);
        //3.将时间戳和序列号拼接在一起形成全局唯一id->使用位运算进行拼接
        return (timeStamp<<COUNT_BIT | id);
    }
}
